package com.ithuang.quartz.task;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

// @Component("task2")
public class Task2 {

    @Autowired
    private JavaMailSender mailSender;

    public void handle() throws InterruptedException, MessagingException, IOException {

        String rootPath = "C:\\Users\\Administrator\\Documents\\jjjj - 副本";
        File rootFolder = new File(rootPath);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        Date givenTime = calendar.getTime();

        // 给定时间（格式：yyyy-MM-dd HH:mm:ss）
        // String givenTimeStr = "2025-03-21 21:03:00";
        // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // Date givenTime = null;
        // try {
        // givenTime = dateFormat.parse(givenTimeStr);
        // } catch (ParseException e) {
        // System.err.println("时间格式错误，请使用 yyyy-MM-dd HH:mm:ss 格式");
        // return;
        // }

        // 输出树形结构
        StringBuffer sf = new StringBuffer();
        countNcFileTree(sf, rootFolder, "", true, givenTime, "jjjj - 副本");
        sf.append(System.lineSeparator());
        printNcFile(sf, rootFolder, "", true, givenTime, "jjjj - 副本");
        sf.append(System.lineSeparator());

        MimeMessage message = mailSender.createMimeMessage();
        // 文本内容
        MimeBodyPart txt = new MimeBodyPart();
        String c = buildContent("接收人007", "wu标题0", sf.toString());
        txt.setContent(c, "text/html;charset=UTF-8");
        txt.addHeader("chartset", "text/html;charset=UTF-8");
        // bodyPartText.setText(c, "UTF-8");
        // 图片内容
        MimeBodyPart img = new MimeBodyPart();
        Path p = Paths.get("C:\\Users\\Administrator\\Pictures\\abc.bmp");
        byte[] bs = Files.readAllBytes(p);
        ByteArrayDataSource sour = new ByteArrayDataSource(bs, "application/octet-stream");
        img.setDataHandler(new DataHandler(sour));
        img.setContentID("cbkj");
        // 附件内容
        MimeBodyPart tach = new MimeBodyPart();
        DataHandler file = new DataHandler(
                new FileDataSource("C:\\Users\\Administrator\\Documents\\jjjj - 副本\\十大家世纪城北区aaabbbb\\蝴蝶雕塑.bmp"));
        tach.setDataHandler(file);
        tach.setFileName(file.getName());
        // 关系:正文和图片
        MimeMultipart muti1 = new MimeMultipart();
        muti1.addBodyPart(txt);
        muti1.addBodyPart(img);
        muti1.setSubType("related");
        // 关系:正文和附件
        MimeMultipart muti2 = new MimeMultipart();
        muti2.addBodyPart(tach);
        // 全文内容
        MimeBodyPart allbody = new MimeBodyPart();
        allbody.setContent(muti1);
        muti2.addBodyPart(allbody);
        muti2.setSubType("mixed");
        // 封装 MimeMessage 对象
        message.setContent(muti2);
        message.setSubject("测试发送邮件");
        message.saveChanges();
        // // 本地查看文件格式
        // message.writeTo(new FileOutputStream("F:\\MixedMail.eml"));
        // message.addRecipient(javax.mail.Message.RecipientType.TO, new
        // InternetAddress("mingyang002@163.com") );
        message.setRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("mingyang002@163.com"));
        message.setFrom(new InternetAddress("mingyang582@163.com"));
        mailSender.send(message);

    }

    public void handle2() throws InterruptedException, MessagingException, IOException {
    }

    /**
     * 封装模板
     * 
     * @param name    接收人姓名
     * @param title   标题
     * @param content 内容
     * @return
     * @throws IOException
     */
    public String buildContent(String name, String title, String content) throws IOException {
        // Date date = new Date();
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 加载邮件html模板
        // File fileName = new File("D:\\mailtemplete.html"); // windows绝对路径
        // File fileName = new File("/opt/template/mailtemplete.html"); // linux绝对路径
        // File fileName = new File("src/main/resources/mailtemplete.html"); // 相对路径
        File file = new File("mailtemplete.html");
        InputStream stream = this.getClass().getResourceAsStream("//mailtemplete.html");
        FileUtils.copyInputStreamToFile(stream, file);
        BufferedReader fileReader = new BufferedReader(new FileReader(file));
        StringBuffer buffer = new StringBuffer();
        String line = "";
        try {
            while ((line = fileReader.readLine()) != null) {
                buffer.append(line);
            }
        } catch (Exception e) {

        } finally {
            fileReader.close();
        }
        // 替换参数
        String htmlText = buffer.toString();
        htmlText = htmlText.replace("{name}", name);
        // htmlText = htmlText.replace("{date}",sdf.format(date));
        // htmlText = htmlText.replace("{title}",title);
        htmlText = htmlText.replace("{content}", content);
        /*
         * 也可以用以下替换参数，但是我使用时报错了，若用以下替换参数的话，邮件模板（html）里面的“{title}”，“{content}”等替换成“{0}”，“
         * {1}”等
         * List<String> list = new ArrayList<>();
         * list.add(name);
         * list.add(sdf.format(date));
         * list.add(title);
         * list.add(content);
         * String htmlText = MessageFormat.format(buffer.toString(), list);
         */
        return htmlText;
    }

    /**
     * 递归遍历目录，输出树形结构并统计相似 .nc 文件的数量
     *
     * @param folder    当前文件夹
     * @param prefix    前缀（用于缩进和连接符号）
     * @param isLast    是否是父文件夹的最后一个子项
     * @param givenTime 给定的时间，只处理修改时间大于该时间的目录
     * @throws IOException
     */
    public static void countNcFileTree(StringBuffer sf, File folder, String prefix, boolean isLast, Date givenTime,
            String parentName) throws IOException {
        // 打印当前文件夹的名称
        sf.append(System.lineSeparator());
        sf.append(prefix + (isLast ? "└── " : "├── ") + folder.getName());

        if (folder.isDirectory()) {
            // 获取文件夹下的所有文件和文件夹
            File[] files = folder.listFiles();
            if (files != null) {
                // 用于统计当前文件夹中的 .nc 文件
                Map<String, Integer> similarityMap = new HashMap<>();

                // 遍历文件和子文件夹
                for (int i = 0; i < files.length; i++) {
                    boolean isLastChild = (i == files.length - 1);
                    if (files[i].isDirectory()) {
                        // 如果是第一级子目录，检查修改时间
                        String avsdf = files[i].getParentFile().getName();
                        if (avsdf.equalsIgnoreCase(parentName)) { // 根目录的子目录
                            long a = files[i].lastModified();
                            long b = givenTime.getTime();
                            // Date aa = new Date(a);
                            // Date bb = new Date(b);
                            if (a > b) {
                                // 如果修改时间大于给定时间，递归遍历
                                countNcFileTree(sf, files[i], prefix + (isLast ? "    " : "│   "), isLastChild,
                                        givenTime, parentName);
                            }
                        } else {
                            // 如果不是第一级子目录，直接递归遍历
                            countNcFileTree(sf, files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime,
                                    parentName);
                        }
                    } else if (files[i].isFile() && files[i].getName().endsWith(".nc")) {
                        // 如果是 .nc 文件，提取相似规则并统计
                        String similarityKey = extractSimilarityKey(files[i].getName());
                        similarityMap.put(similarityKey, similarityMap.getOrDefault(similarityKey, 0) + 1);
                    }
                }

                // 输出当前文件夹中的 .nc 文件统计结果
                for (Map.Entry<String, Integer> entry : similarityMap.entrySet()) {
                    sf.append(System.lineSeparator());
                    sf.append(prefix + (isLast ? "    " : "│   ") + (isLast ? "└── " : "├── ")
                            + entry.getKey().replace("_正面", "") + "  ->  " + entry.getValue());
                }
            }
        }
    }

    /**
     * 提取文件名中的相似规则（去掉前面的数字部分）
     *
     * @param fileName 文件名
     * @return 相似规则
     */
    public static String extractSimilarityKey(String fileName) {
        // 找到第一个非数字字符的位置
        int index = 0;
        while (index < fileName.length() && Character.isDigit(fileName.charAt(index))) {
            index++;
        }
        // 返回去掉前面数字部分后的字符串
        return fileName.substring(index);
    }

    /**
     * 递归遍历目录，输出树形结构（只输出 .nc 文件）
     *
     * @param folder 当前文件夹
     * @param prefix 前缀（用于缩进和连接符号）
     * @param isLast 是否是父文件夹的最后一个子项
     */
    public static void printNcFile(StringBuffer sf, File folder, String prefix, boolean isLast, Date givenTime,
            String parentName) {
        // 打印当前文件夹的名称

        sf.append(System.lineSeparator());
        sf.append(prefix + (isLast ? "└── " : "├── ") + folder.getName());

        if (folder.isDirectory()) {
            // 获取文件夹下的所有文件和文件夹
            File[] files = folder.listFiles();
            if (files != null) {
                // 遍历文件和子文件夹
                for (int i = 0; i < files.length; i++) {
                    boolean isLastChild = (i == files.length - 1);
                    if (files[i].isDirectory()) {
                        // 如果是文件夹，递归遍历
                        // 如果是第一级子目录，检查修改时间
                        String avsdf = files[i].getParentFile().getName();
                        if (avsdf.equalsIgnoreCase(parentName)) { // 根目录的子目录
                            long a = files[i].lastModified();
                            long b = givenTime.getTime();
                            // Date aa = new Date(a);
                            // Date bb = new Date(b);
                            if (a > b) {
                                printNcFile(sf, files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime,
                                        parentName);
                            }
                        } else {

                            printNcFile(sf, files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime,
                                    parentName);
                        }
                    } else if (files[i].isFile() && files[i].getName().toLowerCase().endsWith(".nc")) {
                        // 如果是 .nc 文件，输出
                        sf.append(System.lineSeparator());
                        sf.append(prefix + (isLast ? "    " : "│   ") + (isLastChild ? "└── " : "├── ")
                                + files[i].getName().replace("_正面", ""));
                    }
                }
            }
        }
    }

}
